package EjerciciosEnClase.EjercicioImplementacionListas;

/**
* Implementacion Simplemente Enlazada de Lista<T>
*/

public class ListaSimplementeEnlazada<T> implements Lista<T>{
	
	/**
	* Primer nodo de la lista.
	*/
	private NodoSimple<T> primero;
	private int cantidadDeElementos;
	
	
	public ListaSimplementeEnlazada(){
		this.primero = null;
		this.cantidadDeElementos = 0;
	}
	
	public void agregar(T elemento) {
		NodoSimple<T> nuevoNodo = new NodoSimple<T>(elemento);
		nuevoNodo.setSiguiente(null);
		if(this.estaVacia()){
			this.primero = nuevoNodo;
		}else{
			this.getUltimoNodo();
		}
		this.cantidadDeElementos++;
	}

	@Override
	public void agregar(int posicion, T elemento) {
		// TODO Auto-generated method stub
	}

	public T obtener(int posicion) {
		T elemento = null;
		if (posicion < this.longitud()) {
			NodoSimple<T> actual = this.primero;
			for (int i = 0; i < posicion; i++) {
				actual = actual.getSiguiente();
			}
			elemento = actual.getDato();
		}
		return elemento;
	}

	public T remover(int posicion) {
		T elemento = null;
		if (posicion < this.longitud()) {
			NodoSimple<T> actual = this.primero;
			NodoSimple<T> siguiente = actual.getSiguiente();
			for (int i = 0; i < posicion-1; i++) {
				actual = siguiente;
				siguiente = actual.getSiguiente();
			}
			actual.setSiguiente(siguiente.getSiguiente());
			elemento = siguiente.getDato();
		}
		return elemento;
	}

	public int longitud() {
		return this.cantidadDeElementos;
	}

	public boolean estaVacia() {
		return (this.primero == null);
	}

	public void limpiar() {
		this.primero = null;
	}
	
	/**
	 * @pre: La lista NO puede estar vacia;
	 * 
	 * @post: Devuelve el ultimo Nodo de la lista.
	 */
	private NodoSimple<T> getUltimoNodo() {
		NodoSimple<T> ultimo = this.primero;
		while(ultimo.getSiguiente() != null){
			ultimo = ultimo.getSiguiente();
		}
		return ultimo;
	}
}
